/*
 * Copyright 2008  Telsima Corp.
 * Authors:  Shu Lin <slin@telsima.com>
 */

#ifndef _TW_LIST_H_
#define _TW_LIST_H_

#include "tw_types.h"

typedef struct tw_list_node_s
{
    struct tw_list_node_s *next;
} tw_list_node_t, *tw_list_node_p;

typedef struct tw_list_s
{
    tw_list_node_p  head;
    tw_list_node_p  tail;
    tw_uint32_t     count;
    tw_node_cmp_func nodecmp;
} tw_list_t, *tw_list_p;

void tw_list_init(tw_list_p arg_pList, tw_node_cmp_func nodecmp);
inline tw_uint32_t tw_list_get_count(tw_list_p arg_pList);
inline void tw_list_set_count(tw_list_p arg_pList, tw_uint32_t count);
tw_bool tw_list_isempty(tw_list_p arg_pList);
void tw_list_addtail(tw_list_p arg_pList, tw_list_node_p arg_pItem);
void tw_list_addhead(tw_list_p arg_pList, tw_list_node_p arg_pItem);
tw_list_node_p tw_list_removeitem(tw_list_p arg_pList, void *key);
tw_list_node_p tw_list_removehead(tw_list_p arg_pList);
inline tw_list_node_p tw_list_gethead(tw_list_p arg_pList);
void tw_list_merge(tw_list_p arg_pList, tw_list_p tail_pList);
inline tw_list_node_p tw_list_remove_head_to_end(tw_list_p arg_pList);

#endif /* _TW_LIST_H_ */

